package cn.s1995.sloth.bizs.service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;

import cn.s1995.sloth.bizs.entity.Order;
import cn.s1995.sloth.bizs.oo.req.OrderListREQ;
import cn.s1995.sloth.bizs.oo.vo.OrderVO;
import cn.s1995.sloth.bizs.oo.vo.ShopCartOrderMergerVO;
import cn.s1995.sloth.common.core.util.R;

public interface OrderService extends MPJBaseService<Order> {

	/**
	 * 新增订单缓存
	 * @param userId
	 * @param shopCartOrderMergerDto
	 * @return
	 */
	ShopCartOrderMergerVO putConfirmOrderCache(Long userId, ShopCartOrderMergerVO shopCartOrderMergerDto);

	/**
	 * 根据用户id获取订单缓存
	 * @param userId
	 * @return
	 */
	ShopCartOrderMergerVO getConfirmOrderCache(Long userId);

	/**
	 * 根据用户id删除订单缓存
	 * @param userId
	 */
	void removeConfirmOrderCache(Long userId);


	/**
	 * 提交订单
	 * @param userId
	 * @param mergerOrder
	 * @return
	 */
	List<Order> submit(Long userId, ShopCartOrderMergerVO mergerOrder);


	/**
	 * 分页查询，带订单明细项
	 * @param page
	 * @param req
	 * @return
	 */
	Page pageWithOrderItem(Page page, MPJLambdaWrapper<Order> wrapper);

	/**
	 * 查询订单明细项，封装退款状态
	 * @param list
	 * @return
	 */
	List<OrderVO> setOrderItem(List<OrderVO> list);

	/**
	 * 修改优惠金额
	 * @param id
	 * @param reduceAmount
	 * @return
	 */
	R updateReduceAmount(Long id, BigDecimal reduceAmount);

	/**
	 * 关闭订单
	 * @param id
	 * @return
	 */
	R closeOrder(Long id);

	/**
	 * 取消订单
	 * @param orders		订单列表
	 * @param isAutoCancel  是否自动取消
	 */
    void cancelOrders(List<Order> orders, Boolean... isAutoCancel);

	/**
	 * 确认收货
	 * @param orders
	 */
	void confirmReceiptOrder(List<Order> orders);

	/**
	 * 根据订单状态和时间查询订单和订单项
	 * @param state 订单状态
	 * @param lessThanUpdateTime 更新时间
	 * @return
	 */
	List<Order> getOrderAndOrderItems(Integer state, LocalDateTime lessThanUpdateTime);


	/**
	 * 获取订单列表和订单项
	 * @param ids 订单id
	 * @return
	 */
	List<Order> getOrderAndItemsList(List<Long> ids);

	/**
	 * 根据支付流水id获取订单号
	 * @param payFlowId 支付流水id
	 * @return
	 */
	List<Long> getOrderIdsByPayFlowId(Long payFlowId);

	/**
	 * 获取订单列表
	 * @param payFlowId 支付流水id
	 * @return
	 */
	List<Order> getOrderListByPayFlowId(Long payFlowId);

	/**
	 * 更新订单支付流水id
	 *
	 * @param orderList
	 * @param payFlowNo
	 * @param transactionId
	 * @param payMethod
	 */
    void updateOrderPayFlowId(List<Order> orderList, String payFlowNo, String transactionId, Integer payMethod);

    /**
     * 查询包含退款申请的订单
     * @param page
     * @param req
     * @return
     */
	Page getHasRefundOrderPage(Page page, OrderListREQ req);
}
